C++一维数组

梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)


  本教程将从 C++ 一维数组的核心概念、定义方式、引用方法、初始化规则,到数组越界风险和实际应用场景,全面拆解一维数组的核心用法,帮助你掌握这一基础且重要的编程工具。

教程目录导航

一、数组的核心概念

数组(Array)是 C++ 中最基础的线性数据结构,用于批量存储相同数据类型的多个元素,这些元素在内存中连续存储,并通过「下标(索引)」快速访问。

一维数组是数组的最基础形式,可理解为:

生活类比:一维数组如同电影院的一排座位,每个座位有唯一的编号(下标),且所有座位类型一致(均为“座位”),通过编号可快速找到对应座位。

二、一维数组的定义

一维数组的定义需明确「数据类型」「数组名」和「数组长度」,语法格式如下:

核心语法:


// 标准定义格式
数据类型 数组名[数组长度];

// 示例:定义一个能存储5个整数的一维数组
int arr[5];

// 说明:
// 1. 数据类型:指定数组存储元素的类型(int/float/char等)
// 2. 数组名:符合标识符规则的自定义名称(如arr、score、nums)
// 3. 数组长度:必须是「非负整数常量」(字面量、const常量,不可用变量)
        

合法定义示例:


// 1. 存储10个浮点型数据
float score[10];

// 2. 存储20个字符型数据
char name[20];

// 3. 使用const常量定义长度(推荐,增强可读性)
const int LEN = 8;
double price[LEN];
        

非法定义示例(常见错误):


// 错误1:长度为变量(C++98不支持,C++11后需配合特定编译器设置)
int n = 5;
int arr[n]; 

// 错误2:长度为负数
int arr[-3];

// 错误3:长度为空
int arr[];
        

关键说明:C++ 11 标准后支持「变量长度数组(VLA)」,但属于编译器扩展特性(如GCC支持,MSVC不支持),不推荐使用;如需动态长度数组,建议使用STL的vector容器。

三、一维数组的引用

数组定义后,需通过「下标(索引)」访问单个元素,语法核心是 数组名[下标]

核心语法:


// 读取元素值
数据类型 变量 = 数组名[下标];

// 修改元素值
数组名[下标] = 新值;

// 说明:
// 1. 下标从 0 开始,范围:0 ~ 数组长度-1
// 2. 下标可以是整数、整数变量、表达式
        

基础引用示例:


#include <iostream>
using namespace std;

int main() {
    // 定义长度为5的整型数组
    int arr[5];
    
    // 1. 给数组元素赋值(逐个修改)
    arr[0] = 10;  // 第1个元素(下标0)
    arr[1] = 20;  // 第2个元素(下标1)
    arr[2] = 30;  // 第3个元素(下标2)
    arr[3] = 40;  // 第4个元素(下标3)
    arr[4] = 50;  // 第5个元素(下标4)
    
    // 2. 读取并打印数组元素
    cout << "arr[0] = " << arr[0] << endl;
    cout << "arr[3] = " << arr[3] << endl;
    
    // 3. 通过变量下标访问
    int index = 2;
    cout << "arr[" << index << "] = " << arr[index] << endl;
    
    // 4. 通过表达式下标访问
    cout << "arr[1+2] = " << arr[1+2] << endl;
    
    return 0;
}
        

遍历数组示例(推荐方式):


#include <iostream>
using namespace std;

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    
    // 方式1:for循环遍历(最常用)
    cout << "数组元素:";
    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    
    // 方式2:C++11 范围for循环(简化写法)
    cout << "数组元素(范围for):";
    for (int num : arr) {
        cout << num << " ";
    }
    cout << endl;
    
    return 0;
}
        

四、一维数组的初始化

数组初始化是指在定义数组时直接为元素赋值,C++ 支持多种初始化方式,核心规则是「未显式赋值的元素会被默认初始化」。

4.1 完全初始化

初始化值的数量 等于 数组长度,为每个元素显式赋值。


// 完全初始化:5个元素全部赋值
int arr[5] = {1, 2, 3, 4, 5};

// 验证:遍历输出 1 2 3 4 5
for (int i = 0; i < 5; i++) {
    cout << arr[i] << " ";
}
        

4.2 部分初始化

初始化值的数量 小于 数组长度,未赋值的元素会被默认初始化为 0(整型)/ 0.0(浮点型)/ '\0'(字符型)。


#include <iostream>
using namespace std;

int main() {
    // 部分初始化:前2个元素赋值,后3个默认为0
    int arr[5] = {10, 20};
    
    // 输出:10 20 0 0 0
    for (int i = 0; i < 5; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    
    // 浮点型数组部分初始化:前2个赋值,后2个默认0.0
    float score[4] = {90.5, 88.0};
    // 输出:90.5 88 0 0
    for (int i = 0; i < 4; i++) {
        cout << score[i] << " ";
    }
    
    return 0;
}
        

4.3 省略长度的初始化

定义数组时省略长度,编译器会根据初始化值的数量自动推导数组长度。


#include <iostream>
using namespace std;

int main() {
    // 省略长度:编译器自动推导长度为4
    int arr[] = {10, 20, 30, 40};
    
    // 计算数组长度:sizeof(数组)/sizeof(单个元素)
    int len = sizeof(arr) / sizeof(arr[0]);
    cout << "数组长度:" << len << endl;  // 输出:4
    cout << "数组元素:";
    for (int i = 0; i < len; i++) {
        cout << arr[i] << " ";  // 输出:10 20 30 40
    }
    
    return 0;
}
        

4.4 全部初始化为0

仅写一个 0 作为初始化值,数组所有元素都会被初始化为 0(最常用的清空数组方式)。


#include <iostream>
using namespace std;

int main() {
    // 全部初始化为0:长度10的数组,所有元素都是0
    int arr[10] = {0};
    
    // 输出:0 0 0 0 0 0 0 0 0 0
    for (int i = 0; i < 10; i++) {
        cout << arr[i] << " ";
    }
    
    return 0;
}
        

初始化禁忌:初始化值的数量 不能超过 数组长度,否则编译器直接报错(如 int arr[3] = {1,2,3,4}; 非法)。

五、一维数组越界

数组越界是指访问的下标超出 0 ~ 数组长度-1 的合法范围,这是 C++ 中最常见的编程错误之一。

5.1 越界的危害

5.2 越界示例(危险!)


#include <iostream>
using namespace std;

int main() {
    int arr[3] = {1, 2, 3};
    
    // 合法范围:0、1、2
    cout << arr[2] << endl;  // 合法:输出3
    
    // 非法:下标3超出范围(越界访问)
    cout << arr[3] << endl;  // 输出随机值(未定义行为)
    
    // 非法:越界修改(可能导致程序崩溃)
    arr[5] = 100;
    
    return 0;
}
        

5.3 避免越界的方法


#include <iostream>
#include <cassert>  // 引入断言头文件
using namespace std;

int main() {
    int arr[5] = {1,2,3,4,5};
    int len = sizeof(arr)/sizeof(arr[0]);
    
    for (int i = 0; i < len; i++) {
        // 断言:确保下标合法,非法时直接终止程序并提示
        assert(i >= 0 && i < len);
        cout << arr[i] << " ";
    }
    
    return 0;
}
        

六、一维数组的应用

一维数组是处理「批量同类型数据」的核心工具,以下是典型应用场景:

6.1 数据统计(求和/平均值/最大值/最小值)


#include <iostream>
using namespace std;

int main() {
    // 存储5名学生的成绩
    int scores[5] = {85, 92, 78, 90, 88};
    int sum = 0;       // 总分
    int maxScore = 0;  // 最高分
    int minScore = 100;// 最低分
    int len = sizeof(scores)/sizeof(scores[0]);
    
    for (int i = 0; i < len; i++) {
        sum += scores[i];          // 累加总分
        if (scores[i] > maxScore) {
            maxScore = scores[i];  // 更新最高分
        }
        if (scores[i] < minScore) {
            minScore = scores[i];  // 更新最低分
        }
    }
    
    // 计算平均分(强制浮点型)
    float avg = (float)sum / len;
    
    // 输出结果
    cout << "总分:" << sum << endl;        // 433
    cout << "平均分:" << avg << endl;      // 86.6
    cout << "最高分:" << maxScore << endl; // 92
    cout << "最低分:" << minScore << endl; // 78
    
    return 0;
}
        

6.2 数据排序(冒泡排序)


#include <iostream>
using namespace std;

int main() {
    int arr[6] = {34, 7, 23, 32, 5, 62};
    int len = sizeof(arr)/sizeof(arr[0]);
    
    // 冒泡排序:升序排列
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {
                // 交换相邻元素
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    
    // 输出排序结果:5 7 23 32 34 62
    cout << "排序后数组:";
    for (int num : arr) {
        cout << num << " ";
    }
    
    return 0;
}
        

6.3 数据查找(线性查找)


#include <iostream>
using namespace std;

// 线性查找函数:找到返回下标,未找到返回-1
int findElement(int arr[], int len, int target) {
    for (int i = 0; i < len; i++) {
        if (arr[i] == target) {
            return i; // 找到目标,返回下标
        }
    }
    return -1; // 未找到
}

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int len = sizeof(arr)/sizeof(arr[0]);
    int target = 30;
    
    int index = findElement(arr, len, target);
    if (index != -1) {
        cout << "找到 " << target << ",下标为:" << index << endl;
    } else {
        cout << "未找到 " << target << endl;
    }
    
    return 0;
}
        

七、注意事项

八、总结

本教程从 C++ 一维数组的核心概念、定义、引用、初始化,到越界风险和实际应用,全面拆解了一维数组的核心用法。掌握一维数组的运用,是学习数据结构的重要基础之一。


返回顶部